package fileinn

import (
	"fmt"
	"os"
	"path/filepath"
	"sync"
	"time"
)

// DelFileList 等待删除的文件列表
var DelFileList sync.Map

// Monitor 文件监听 会不停的去检测文件 计算哈希 与数据库进行对比
//一个有用的文件遍历方法  path/filepath 中的 Walk
func Monitor() {
	for {
		time.Sleep(time.Second * 10)
		//查找
		wkerr := filepath.Walk(SavePath, walk)
		if wkerr != nil {
			fmt.Println(wkerr)
			continue
		}
		DelFileList.Range(func(name, path interface{}) bool {
			var err error
			vrname := name.(string)
			vrpath := path.(string)
			if err = os.RemoveAll(vrpath); err != nil {
				fmt.Println(err)
				return false
			}
			if err := Delete(vrname); err != nil {
				fmt.Println(err)
				return false
			}
			DelFileList.Delete(vrname)
			time.Sleep(time.Microsecond * 100)
			return true
		})
		time.Sleep(CycleTime)
	}

}
func walk(path string, info os.FileInfo, perr error) error {
	if info.IsDir() {
		//处理文件夹类型
		if path == SavePath {
			return nil
		}
		abspath, err := filepath.Abs(path)
		if err != nil {
			return err
		}
		//分析文件夹名称
		_, name := filepath.Split(path)

		// 查询数据库内文件信息
		fileObj, err := Select(name)
		if err != nil {
			return err
		}

		//如果查不到
		if fileObj == nil {

			DelFileList.Store(name, abspath)
			return nil
		}

		//过期值为0 永不过期
		if time.Since(fileObj.ExpiredTime) == 0 {
			return nil
		}

		//过期检测
		if fileObj.ExpiredTime.Before(time.Now()) {
			DelFileList.Store(name, abspath)
			return nil
		}

	} else {

		//处理文件类型
		// 检查是否是数据库文件 如果是就忽略
		_, filename := filepath.Split(path)
		if filename == FileName {
			return nil
		}

		abspath, err := filepath.Abs(path)
		if err != nil {
			return err
		}

		// 查询数据库内文件信息
		fileObj, err := Select(filename)
		if err != nil {
			return err
		}

		//如果查不到
		if fileObj == nil {
			//根据文件的最后更新时间 超过20分钟删除
			if info.ModTime().Add(time.Minute * 20).Before(time.Now()) {
				DelFileList.Store(filename, abspath)
			}
			return nil
		}

		//过期值为0 永不过期
		if time.Since(fileObj.ExpiredTime) == 0 {
			return nil
		}

		//过期检测
		if fileObj.ExpiredTime.Before(time.Now()) {
			DelFileList.Store(filename, abspath)
		}
	}

	return nil
}

// Start 启动服务
func Start() {
	go Monitor()
}
